home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 076-100 / scopedisk83 / popcli4 / popsubr.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  5KB  |  152 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  2. /* |_o_o|\\ Copyright (c) 1986 The Software Distillery.  All Rights Reserved */
  3. /* |. o.| || This program may not be distributed without the permission of   */
  4. /* | .  | || the authors.                                                    */
  5. /* | o  | ||    Dave Baker     Ed Burnette  Stan Chow    Jay Denebeim        */
  6. /* |  . |//     Gordon Keener  Jack Rouse   John Toebes  Doug Walker         */
  7. /* ======          BBS:(919)-471-6436      VOICE:(919)-469-4210              */ 
  8. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  9. /*
  10.  * VERY loosely based on the input.device example by Rob Peck, 12/1/85
  11.  */
  12.  
  13. #include "popcli.h"
  14. #include "popbug.h"
  15.  
  16. /************************************************************************/
  17. /* the handler subroutine - called through the handler stub             */
  18. /************************************************************************/
  19. struct InputEvent *
  20. __asm
  21. myhandler(
  22.   register __a0 struct InputEvent *ev,  /* pointer to a list of events */
  23.   register __a1 GLOBAL_DATA *gptr)      /* Everything we need to know  */
  24. {
  25.    register struct InputEvent          *ep, *laste;
  26.    register struct OURMSG              *msg;
  27.  
  28.    /* run down the list of events to see if they pressed a magic button */
  29.    for (ep = ev, laste = NULL; ep != NULL; ep = ep->ie_NextEvent)
  30.    {
  31.       if ((ep->ie_Class == IECLASS_RAWKEY)    &&
  32.           (ep->ie_Qualifier & IEQUALIFIER_LCOMMAND) &&
  33.       (gptr->keytab[ep->ie_Code] != NULL))    /* if key is currently active */
  34.       {
  35.          /* we can handle this event so take it off the chain */
  36.          if (laste == NULL)
  37.             ev = ep->ie_NextEvent;
  38.          else
  39.             laste->ie_NextEvent = ep->ie_NextEvent;
  40.  
  41.          /* Send a message, so that ol'buddy will know what to do. */
  42.          msg = (struct OURMSG *)
  43.                        AllocMem( sizeof(struct OURMSG),
  44.                                  (MEMF_CLEAR | MEMF_PUBLIC) );
  45.  
  46.          /* If we can't get memory, shut up because we can't run   */
  47.          /* anything anyway.                                       */
  48.          if (msg)
  49.          {
  50.             msg->msgpart.mn_Length = sizeof(struct OURMSG);
  51.             msg->type = MSG_EXECUTE;
  52.             msg->key = ep->ie_Code;
  53.  
  54.             PutMsg( gptr->execport, (struct Message *)msg );
  55.          }
  56.          else
  57.             laste = ep;
  58.       }
  59.       else
  60.          laste = ep;
  61.  
  62.       if (ep->ie_Class != IECLASS_TIMER)
  63.          {
  64.          gptr->noevents = 0;
  65.          if (gptr->blankscreen != NULL)
  66.             Signal(gptr->buddy, gptr->unblanksig);
  67.          }
  68.       }
  69.  
  70.    /* pass on the pointer to the event */
  71.    return(ev);
  72. }
  73.  
  74.  
  75. struct MsgPort *MyCreatePort(gptr, name)
  76. register GLOBAL_DATA *gptr;
  77. char *name;
  78. {
  79.    register UBYTE sigbit;
  80.    register struct MsgPort *port;
  81.  
  82.    if ((sigbit = AllocSignal(-1)) == -1)
  83.       return((struct MsgPort *)0);
  84.  
  85.    if ((port = (struct MsgPort *)AllocMem(sizeof(struct MsgPort),
  86.                         MEMF_CLEAR|MEMF_PUBLIC)) == 0)
  87.       {
  88.       FreeSignal(sigbit);
  89.       return((struct MsgPort *) (0));
  90.       }
  91.    port->mp_Node.ln_Name = name;
  92.    port->mp_Node.ln_Pri = 0;
  93.    port->mp_Node.ln_Type = NT_MSGPORT;
  94.    port->mp_Flags = PA_SIGNAL;
  95.    port->mp_SigBit = sigbit;
  96.    port->mp_SigTask = (struct Task *)FindTask(0);
  97.    AddPort(port);
  98.    return(port);
  99. }
  100.  
  101. void MyDeletePort(gptr, port)
  102. register GLOBAL_DATA *gptr;
  103. register struct MsgPort *port;
  104. {
  105.    RemPort(port);
  106.    FreeSignal(port->mp_SigBit);
  107.    FreeMem((char *)port,sizeof(struct MsgPort));
  108. }
  109.  
  110. struct IOStdReq *CreateIOReq(gptr, port, size)
  111. GLOBAL_DATA *gptr;
  112. struct MsgPort *port;
  113. int size;
  114. {
  115.    register struct IOStdReq *ioReq;
  116.  
  117.    if ((ioReq = (struct IOStdReq *)
  118.                 AllocMem(size, MEMF_CLEAR | MEMF_PUBLIC)) != NULL)
  119.       {
  120.       ioReq->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  121.       ioReq->io_Message.mn_Node.ln_Pri  = 0;
  122.       ioReq->io_Message.mn_Length       = size;
  123.       ioReq->io_Message.mn_ReplyPort    = port;
  124.       }
  125.    return(ioReq);
  126. }
  127.  
  128. void DeleteIOReq(gptr, ioReq)
  129. GLOBAL_DATA *gptr;
  130. register struct IOStdReq *ioReq;
  131. {
  132.    ioReq->io_Message.mn_Node.ln_Type = 0xff;
  133.    ioReq->io_Device = (struct Device *) -1;
  134.    ioReq->io_Unit = (struct Unit *) -1;
  135.  
  136.    FreeMem( (char *)ioReq, ioReq->io_Message.mn_Length);
  137. }
  138.  
  139. /************************************************************************/
  140. /* Queue a timer to go off in a given number of seconds                 */
  141. /************************************************************************/
  142. void QueueTimer(gptr, tr, seconds)
  143. GLOBAL_DATA *gptr;
  144. struct timerequest *tr;
  145. ULONG seconds;
  146. {
  147.    tr->tr_node.io_Command = TR_ADDREQUEST;   /* add a new timer request */
  148.    tr->tr_time.tv_secs =  seconds;            /* seconds */
  149.    tr->tr_time.tv_micro = 0;
  150.    SendIO( (struct IORequest *)tr );
  151. }
  152.